home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 338_01 / asinit.c < prev    next >
Text File  |  1989-11-29  |  10KB  |  343 lines

  1. /*    asinit.c, the source of a 68000 assembler.... initialization
  2.  *    (C) Copyright 1982 Steve Passe
  3.  *    All Rights Reserved
  4.  *
  5.  *  ver. 1.00
  6.  * created 10/7/82
  7.  *
  8.  * version 1.01
  9.  *
  10.  *    8/30/83 ver. 1.01 modified for Aztec ver. 1.05g smp
  11.  *    12/23/83    fixed 24 bit address bug in flush_rcrd smp
  12.  *    12/24/83    fixed lowercase    a-f in S-records smp
  13.  *    10/09/87    split from as68.c for overlay on PDP-11
  14.  */
  15.  
  16. /* begincode */
  17.  
  18. /* includes */
  19.  
  20. #include <stdio.h>
  21. #include "as68.h"
  22.  
  23. /* externals */
  24.  
  25. extern struct _symbol *symtbl;
  26. extern struct _symbol *syms_head;    /* head of sym table free space */
  27. extern char *syms_tail;            /* tail of sym table free space */
  28. extern int symspace;            /* bytes in symbol table */
  29. extern int symbols;            /* number of symbols in table */
  30.  
  31. extern FLAG fatal;
  32. extern char pass;            /* present pass number, 1 or 2 */
  33. extern unsigned line_count;        /* line number of source file */
  34. extern unsigned list_count;        /* line # of list file */
  35. extern long loc_counter;        /* address to assemble obj code */
  36. extern int loc_plus;            /* increment to loc counter    */
  37. extern char lcksm;        /* bytes + addr. + count + lcksm == 0xff */
  38. extern FLAG abs_long;            /* default to absolute long add.*/
  39. extern FLAG rorg;            /* prog. counter relative flag */
  40. extern FLAG do_label;            /* process label if set */
  41. extern char statement[STMNT_SIZE];    /* statement line buffer */
  42. extern char label[32];            /* bufr for label from preparse */
  43. extern char instr[32];            /* bufr for mnem, psdo or macro */
  44. extern char *opfld_ptr;            /* pointer to operand field */
  45. extern int wrap;            /* wrap column for list output */
  46. extern FLAG trunc;            /* truncate lines in listing */
  47. extern char source_name[FNAME_SIZE];    /* source file name */
  48. extern int src_level;            /* source file level */
  49. extern FILE *_src[SRCLEVELS];        /* source file descripters */
  50. extern FLAG objchnl;            /* Motorola S ('s') or nil ('x') */
  51. extern FLAG obj_open;            /* object channel open flag */
  52. extern char of_disk;            /* default object file drive */
  53. extern char object_name[FNAME_SIZE];    /* object file name */
  54. extern FILE *obj_f;            /* object file descripter */
  55. extern FLAG lstchnl;            /* list channel(s) open */
  56. extern FLAG nolist;            /* flag for list/nolist pseudos */
  57. extern FLAG lcon;            /* list to console flag */
  58. extern FLAG llst;            /* list to list device flag */
  59. extern FLAG lfile;            /* list to file flag */
  60. extern FLAG lfile_open;           /* list file open flag */
  61. extern char lf_disk;            /* default list file drive */
  62. extern char list_name[FNAME_SIZE];    /* listing file name */
  63. extern FILE *lst_f, *lst_d;        /* listing file & dev descripter */
  64. extern FLAG errchnl;            /* error channel(s) open */
  65. extern FLAG econ;            /* errors to console flag */
  66. extern FLAG elst;            /* errors to list device flag */
  67. extern FLAG elfile;            /* errors to listing file */
  68. extern FLAG efile;            /* errors to error file */
  69. extern FLAG efile_open;           /* error file open flag */
  70. extern char ef_disk;            /* default error file drive */
  71. extern char error_name[FNAME_SIZE];    /* error file name */
  72. extern FILE *err_f;            /* error file descripter */
  73. extern struct _oprnd op1, op2;        /* structs to hold operand val */
  74.  
  75. extern char code[12];            /* 12 minimum for overflow */
  76. extern char buf[85];
  77.  
  78. extern long lex_val;
  79. extern char *p;
  80.  
  81. extern struct _mtable mtable[];
  82.  
  83. /* types */
  84.  
  85. char *nextfield();
  86. long dtol();
  87. char * cisat();
  88.  
  89. /* beginmain */
  90.  
  91. asinit(argc, argv)
  92. int argc;
  93. char *argv[];
  94. {
  95.     register int x, y;
  96.     char *c_ptr;            /* scratch pointer to char */
  97.     char _ext[5];            /* scratch ext buffer */
  98.  
  99.     puts("AS68, ver 1.02, 68000 assembler, (C) Copyright 1982 Steve Passe\n");
  100.  
  101. /** parse the command line, setting variables as needed */
  102.  
  103.     if (argc < 2) {
  104.         puts("Usage: AS68 sourcefile.asm options\n");
  105.         puts("Option\nec    errors to console");
  106.         puts("ee  errors to errorfile  (sourcefile.err)");
  107.         puts("ef  errors to listfile   (sourcefile.ls)");
  108.         puts("lc  list to console");
  109.         puts("lf  list to listfile     (sourcefile.ls)");
  110.         puts("os  object file output   (sourcefile.s19)");
  111.         puts("ox  no object file created");
  112.         puts("t   truncate source code lines in listing");
  113.         puts("w   wrap source code lines in listing");
  114.         exit(0);
  115.     }
  116.  
  117. /** set flag variables according to command line args */
  118.  
  119.     for (x = 2; x < argc; ++x) {
  120.     switch (tolower(argv[x][0])) {
  121.     case 'e':                    /* error file opt */
  122.         econ = NO;
  123.         for (y = 1; argv[x][y]; ++y) {
  124.         switch (tolower(argv[x][y])) {
  125.         case 'c':   econ = YES;     continue;
  126.         case 'l':   elst = YES;     continue;
  127.         case 'f':   elfile = YES;   continue;
  128.         case 'e':   efile = YES;
  129.             if (argv[x][y+1] && argv[x][y+2] == ':') {
  130.             ef_disk    = argv[x][++y];
  131.             ++y;
  132.             }
  133.             continue;
  134.         default:    errchnl = NO;
  135.         }
  136.         }
  137.         continue;
  138.     case 'l':                    /* list file opt */
  139.         lstchnl = YES;
  140.         for (y = 1; argv[x][y]; ++y) {
  141.         switch (tolower(argv[x][y])) {
  142.         case 'c':   lcon = YES;     continue;
  143.         case 'l':   llst = YES;     continue;
  144.         case 'f':   lfile = YES;
  145.             if (argv[x][y+1] && argv[x][y+2] == ':') {
  146.             lf_disk    = argv[x][++y];
  147.             ++y;
  148.             }
  149.             continue;
  150.         default:    lstchnl = NO;
  151.         }
  152.         }
  153.         continue;
  154.     case 'o':                    /* object file opt */
  155.         for (y = 1; argv[x][y]; ++y) {
  156.         switch (tolower(argv[x][y])) {
  157.         case 's':   objchnl = 's';
  158.             if (argv[x][y+1] && argv[x][y+2] == ':') {
  159.             of_disk    = argv[x][++y];
  160.             ++y;
  161.             }
  162.             continue;
  163.         default:    objchnl = 'x';
  164.         }
  165.         }
  166.         continue;
  167.     case 's':
  168.         opfld_ptr = &argv[x][1];
  169.         symspace = (int) dtol();
  170.         continue;
  171.     case 'w':
  172.         wrap = atoi(&argv[x][1]);
  173.         if (wrap < 60) wrap = 60;
  174.         continue;
  175.     case 't':
  176.         trunc = YES;
  177.         continue;
  178.     default:  printf("\nInvalid option  (%c)\n", argv[x][0]);
  179.               exit(0);
  180.     }
  181.     }
  182.  
  183.     /* allocate space for symbol table */
  184.     if (!(symtbl = (struct _symbol *) malloc(symspace))) {
  185.     printf("\n...symbol table too large (%d)", symspace);
  186.     exit(0);
  187.     }
  188.     syms_head = symtbl + 1;             /* init free space head */
  189.     syms_tail = (char *) symtbl;
  190.     syms_tail += symspace;            /* init free space tail */
  191.  
  192.     symtbl[0]._sym = "";            /* dummy entry */
  193.     symtbl[0]._val = NULL;
  194.     symtbl[0]._atr = NULL;
  195.  
  196. /* initialize sourcename, errname, listname, and objname */
  197.  
  198.     if (too_long(argv[1], 14)) {
  199.     exit(0);
  200.     }
  201.     if (argv[1][1] == ':') {            /* a disk identifier exists */
  202.     strcpy(source_name, argv[1]);            /* get source file name */
  203.     }
  204.     else {                      /* default to logged in disk */
  205.     if (too_long(argv[1], 12)) {
  206.         exit(0);
  207.     }
  208.     strcat(source_name, argv[1]);            /* add the name */
  209.     }
  210.     if (c_ptr = cisat('.', source_name)) {      /* if extension    */
  211.     word_copy(_ext,    4, c_ptr);            /* save ext */
  212.     *c_ptr = '\0';                  /* erase it */
  213.     }
  214.     else strcpy(_ext, ".asm");            /* default extension */
  215.     if (too_long(source_name, 10)) {
  216.     exit(0);
  217.     }
  218.     strcpy(object_name,    source_name);        /* make object file name */
  219.     switch (objchnl) {
  220.     case 'x':   break;                    /* none wanted */
  221.     case 's':   strcat(object_name, ".s19");    /* for Motorola    S FILE */
  222.         break;
  223.     default:    printf("\n...bad object file type ('%c')", objchnl);
  224.     }
  225.     if (of_disk) object_name[0]    = of_disk;    /* pick up option */
  226.     strcpy(list_name, source_name);
  227.     strcat(list_name, ".ls");            /* make list file name */
  228.     if (lf_disk) list_name[0] = lf_disk;    /* option */
  229.     strcpy(error_name, source_name);
  230.     strcat(error_name, ".err");            /* make error file name */
  231.     if (ef_disk) error_name[0] = ef_disk;    /* option */
  232.     strcat(source_name,    _ext);            /* add ext. */
  233.  
  234.     /* open appropriate    source,    list, error, and object files */
  235.  
  236.     if (!(_src[0] = fopen(source_name, "r"))) {
  237.     printf("\n...can't open source (\"%s\")", source_name);
  238.     exit(0);
  239.     }
  240.                     /* open list, err, and obj as needed */
  241.     if (objchnl    != 'x') {
  242.     if (!(obj_f = fopen(object_name, "w"))) {
  243.         printf("\n...can't open object (\"%s\")", object_name);
  244.         exit(0);
  245.     }
  246.     obj_open = TRUE;
  247.     obj_out(OPEN, 0, 0);
  248.     }
  249.     if (lfile) {
  250.     if